package enums.base;

import java.util.Optional;
import java.util.stream.Stream;

/**
 * @author lihao
 * @since 2019/5/17 11:34
 */
public interface EnumKvd<K,V,D> {
    K getKey();
    V getValue();
    D getDesc();

    /**
     * 状态值转成枚举
     * @param key
     * @param <C>
     * @return
     */
    static <C extends Enum<C> & EnumKvd<K,?,?>,K> C parseEnum(K key,Class<C> child){
        Optional<? extends EnumKvd> matched = Stream.of(child.getEnumConstants()).filter(e->e.getKey().equals(key)).findFirst();
        return matched.map(child::cast).orElse(null);
    }

    /**
     * 是否为枚举状态值
     * @param key
     * @return
     */
    static <C extends Enum<C> & EnumKvd<K,?,?>,K> boolean existsEnum(K key, Class<C> child) {
        return Stream.of(child.getEnumConstants()).anyMatch(e->e.getKey().equals(key));
    }

    /**
     *
     * @param child
     * @param key
     * @param <C>
     * @param <K>
     * @param <V>
     * @return
     */
    static <C extends Enum<C> & EnumKvd<K,V,?>,K,V> V parseValue(K key, Class<C> child) {
        EnumKvd<K,V,?> enumKv = parseEnum(key,child);
        if(enumKv != null){
            return enumKv.getValue();
        }
        return null;
    }
    /**
     *
     * @param child
     * @param key
     * @param <C>
     * @param <K>
     * @param <D>
     * @return
     */
    static <C extends Enum<C> & EnumKvd<K,?,D>,K,D> D parseDesc(K key, Class<C> child) {
        EnumKvd<K,?,D> enumKv = parseEnum(key,child);
        if(enumKv != null){
            return enumKv.getDesc();
        }
        return null;
    }
}
